home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 4 / Info_Mac IV CD-ROM (Pacific HiTech Inc.)(August 1994).iso / Development / General / DR1.#1 PPC C⁄C++ ƒ / C++ Runtime ƒ / ptmf.s < prev    next >
Text File  |  1994-01-22  |  6KB  |  199 lines

  1. #    ptmf.s    -    pointer-to-member-function support for Metrowerks C++ for PowerPC
  2. #
  3. #    Copyright © 1993 metrowerks inc.  All Rights Reserved.
  4. #
  5. #
  6. #    THEORY OF OPERATION
  7. #
  8. #    A pointer-to-member-function (PTMF) is represented as a 3-word struct:
  9. #
  10. #        +-----------------------------+            +-----------------------------+
  11. #        |        'this' delta          |            |        'this' delta          |
  12. #        |-----------------------------|         |-----------------------------|
  13. #        |            -1                  |            |         vtbl index           |
  14. #        |-----------------------------|         |-----------------------------|
  15. #        |        function pointer      |            |         vptr offset          |
  16. #        +-----------------------------+            +-----------------------------+
  17. #
  18.  
  19. #
  20. #    Assembler Equates
  21. #
  22. .set r0,0; .set SP,1; .set RTOC,2; .set r3,3; .set r4,4; .set r5,5; .set r6,6; .set r7,7
  23. .set r8,8; .set r9,9; .set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14; .set r15,15
  24. .set r16,16; .set r17,17; .set r18,18; .set r19,19; .set r20,20; .set r21,21; .set r22,22; .set r23,23
  25. .set r24,24; .set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29; .set r30,30; .set r31,31
  26. .set fp0,0; .set fp1,1; .set fp2,2; .set fp3,3; .set fp4,4; .set fp5,5; .set fp6,6; .set fp7,7
  27. .set fp8,8; .set fp9,9; .set fp10,10; .set fp11,11; .set fp12,12; .set fp13,13; .set fp14,14; .set fp15,15
  28. .set fp16,16; .set fp17,17; .set fp18,18; .set fp19,19; .set fp20,20; .set fp21,21; .set fp22,22; .set fp23,23
  29. .set fp24,24; .set fp25,25; .set fp26,26; .set fp27,27; .set fp28,28; .set fp29,29; .set fp30,30; .set fp31,31
  30. .set cr0,0; .set cr1,1; .set cr2,2; .set cr3,3; .set cr4,4; .set cr5,5; .set cr6,6; .set cr7,7
  31. .set MQ,0; .set XER,1; .set FROM_RTCU,4; .set FROM_RTCL,5; .set FROM_DEC,6; .set LR,8; .set CTR,9; .set TID,17
  32. .set DSISR,18; .set DAR,19; .set TO_RTCU,20; .set TO_RTCL,21; .set TO_DEC,22; .set SDR_0,24; .set SDR_1,25; .set SRR_0,26
  33. .set SRR_1,27
  34. .set BO_dCTR_NZERO_AND_NOT,0; .set BO_dCTR_NZERO_AND_NOT_1,1; .set BO_dCTR_ZERO_AND_NOT,2; .set BO_dCTR_ZERO_AND_NOT_1,3
  35. .set BO_IF_NOT,4; .set BO_IF_NOT_1,5; .set BO_IF_NOT_2,6; .set BO_IF_NOT_3,7
  36. .set BO_dCTR_NZERO_AND,8; .set BO_dCTR_NZERO_AND_1,9; .set BO_dCTR_ZERO_AND,10; .set BO_dCTR_ZERO_AND_1,11
  37. .set BO_IF,12; .set BO_IF_1,13; .set BO_IF_2,14; .set BO_IF_3,15
  38. .set BO_dCTR_NZERO,16; .set BO_dCTR_NZERO_1,17; .set BO_dCTR_ZERO,18; .set BO_dCTR_ZERO_1,19
  39. .set BO_ALWAYS,20; .set BO_ALWAYS_1,21; .set BO_ALWAYS_2,22; .set BO_ALWAYS_3,23
  40. .set BO_dCTR_NZERO_8,24; .set BO_dCTR_NZERO_9,25; .set BO_dCTR_ZERO_8,26; .set BO_dCTR_ZERO_9,27
  41. .set BO_ALWAYS_8,28; .set BO_ALWAYS_9,29; .set BO_ALWAYS_10,30; .set BO_ALWAYS_11,31
  42. .set CR0_LT,0; .set CR0_GT,1; .set CR0_EQ,2; .set CR0_SO,3
  43. .set CR1_FX,4; .set CR1_FEX,5; .set CR1_VX,6; .set CR1_OX,7
  44. .set CR2_LT,8; .set CR2_GT,9; .set CR2_EQ,10; .set CR2_SO,11
  45. .set CR3_LT,12; .set CR3_GT,13; .set CR3_EQ,14; .set CR3_SO,15
  46. .set CR4_LT,16; .set CR4_GT,17; .set CR4_EQ,18; .set CR4_SO,19
  47. .set CR5_LT,20; .set CR5_GT,21; .set CR5_EQ,22; .set CR5_SO,23
  48. .set CR6_LT,24; .set CR6_GT,25; .set CR6_EQ,26; .set CR6_SO,27
  49. .set CR7_LT,28; .set CR7_GT,29; .set CR7_EQ,30; .set CR7_SO,31
  50.  
  51.  
  52. #
  53. #    PTMF Equates
  54. #
  55.         .set    this_delta,0
  56.         .set    vtbl_index,4
  57.         .set    vptr_offset,8
  58.  
  59.  
  60. #
  61. #    Public Data
  62. #
  63.         .csect    __ptmf_null{RO}
  64.         .globl    __ptmf_null{RO}
  65.         .long    0, 0, 0
  66.         
  67.  
  68. #    __ptmf_test    -    test pointer-to-member-function for null
  69. #
  70. #    R3 contains the PTMF. If it is null, we return 0; else we return 1.
  71. #
  72.         .csect    .__ptmf_test{PR}
  73.         .globl    .__ptmf_test{PR}
  74.         lwz        r5,this_delta(r3)
  75.         lwz        r6,vtbl_index(r3)
  76.         lwz        r7,vptr_offset(r3)
  77.         li        r3,1
  78.         cmpi    cr0,r5,0
  79.         cmpi    cr6,r6,0
  80.         cmpi    cr7,r7,0
  81.         bnelr    cr0
  82.         bnelr    cr6
  83.         bnelr    cr7
  84.         li        r3,0
  85.         blr
  86.         
  87.  
  88. #    __ptmf_cmpr    -    compare two pointer-to-member-functions
  89. #
  90. #    R3 and R4 contain the PTMFs. If equal, we return 0; else we return 1.
  91. #
  92.         .csect    .__ptmf_cmpr{PR}
  93.         .globl    .__ptmf_cmpr{PR}
  94.         lwz        r5,this_delta(r3)
  95.         lwz        r6,this_delta(r4)
  96.         lwz        r7,vtbl_index(r3)
  97.         lwz        r8,vtbl_index(r4)
  98.         lwz        r9,vptr_offset(r3)
  99.         lwz        r10,vptr_offset(r4)
  100.         li        r3,1
  101.         cmp        cr0,r5,r6
  102.         cmp        cr6,r7,r8
  103.         cmp        cr7,r9,r10
  104.         bnelr    cr0
  105.         bnelr    cr6
  106.         bnelr    cr7
  107.         li        r3,0
  108.         blr
  109.  
  110.  
  111. #    __ptmf_call        -    call pointer-to-member-function
  112. #
  113. #    R12 contains the PTMF. R3 contains 'this'.
  114. #
  115.         .csect    .__ptmf_call{GL}
  116.         .globl    .__ptmf_call{GL}
  117.         lwz        r0,this_delta(r12)
  118.         lwz        r11,vtbl_index(r12)
  119.         lwz        r12,vptr_offset(r12)    #    function pointer if not virtual
  120.         cmpi    cr0,r11,0
  121.         add        r3,r3,r0                #    adjust 'this'
  122.         blt        cr0,L.1
  123.         lwzx    r12,r3,12                #    get vptr
  124.         add        r12,r12,r11                #    point to vtbl entry
  125.         lwz        r0,4(r12)                #    get 'this' delta
  126.         lwz        r12,0(r12)                #    get function pointer
  127.         add        r3,r3,r0                #    adjust 'this' again
  128. L.1:    lwz        r0,0(r12)
  129.         stw        RTOC,20(SP)
  130.         mtctr    r0
  131.         lwz        RTOC,4(r12)
  132.         bctr
  133.  
  134.  
  135. #    __ptmf_call4    -    call pointer-to-member-function, 'this' in R4
  136. #
  137. #    R12 contains the PTMF. R4 contains 'this'.
  138. #
  139.         .csect    .__ptmf_call4{GL}
  140.         .globl    .__ptmf_call4{GL}
  141.         lwz        r0,this_delta(r12)
  142.         lwz        r11,vtbl_index(r12)
  143.         lwz        r12,vptr_offset(r12)    #    function pointer if not virtual
  144.         cmpi    cr0,r11,0
  145.         add        r4,r4,r0                #    adjust 'this'
  146.         blt        cr0,L.2
  147.         lwzx    r12,r4,12                #    get vptr
  148.         add        r12,r12,r11                #    point to vtbl entry
  149.         lwz        r0,4(r12)                #    get 'this' delta
  150.         lwz        r12,0(r12)                #    get function pointer
  151.         add        r4,r4,r0                #    adjust 'this' again
  152. L.2:    lwz        r0,0(r12)
  153.         stw        RTOC,20(SP)
  154.         mtctr    r0
  155.         lwz        RTOC,4(r12)
  156.         bctr
  157.  
  158.  
  159. #    __ptmf_scall    -    call pointer-to-member-function
  160. #
  161. #    This is used when we know the class tree uses single inheritance only.
  162. #    R12 contains the PTMF. R3 contains 'this'.
  163. #
  164. #
  165.         .csect    .__ptmf_scall{GL}
  166.         .globl    .__ptmf_scall{GL}
  167.         lwz        r11,vtbl_index(r12)
  168.         lwz        r12,vptr_offset(r12)    #    function pointer if not virtual
  169.         cmpi    cr0,r11,0
  170.         blt        cr0,L.3
  171.         lwzx    r12,r3,12                #    get vptr
  172.         lwzx    r12,r12,r11                #    get function pointer
  173. L.3:    lwz        r0,0(r12)
  174.         stw        RTOC,20(SP)
  175.         mtctr    r0
  176.         lwz        RTOC,4(r12)
  177.         bctr
  178.  
  179.  
  180. #    __ptmf_scall4    -    call pointer-to-member-function
  181. #
  182. #    This is used when we know the class tree uses single inheritance only.
  183. #    R12 contains the PTMF. R4 contains 'this'.
  184. #
  185. #
  186.         .csect    .__ptmf_scall4{GL}
  187.         .globl    .__ptmf_scall4{GL}
  188.         lwz        r11,vtbl_index(r12)
  189.         lwz        r12,vptr_offset(r12)    #    function pointer if not virtual
  190.         cmpi    cr0,r11,0
  191.         blt        cr0,L.4
  192.         lwzx    r12,r4,12                #    get vptr
  193.         lwzx    r12,r12,r11                #    get function pointer
  194. L.4:    lwz        r0,0(r12)
  195.         stw        RTOC,20(SP)
  196.         mtctr    r0
  197.         lwz        RTOC,4(r12)
  198.         bctr
  199.